Docker 권한 및 Docker in Docker (DinD) 심화 설정

1. Docker 권한 문제 해결

1.1 Jenkins 컨테이너 내부 권한 설정

# root 권한으로 Jenkins 컨테이너 접속
docker exec -it --user root jenkins bash

# 필요한 패키지 설치 및 권한 설정
apt-get update
apt-get install -y sudo
groupadd -f docker
usermod -aG docker jenkins

# 컨테이너 나가기
exit

# Jenkins 컨테이너 재시작
docker restart jenkins
2026-10 갱신

groupadd -f docker는 컨테이너 내부에 임의의 GID로 그룹을 만들기 때문에, 호스트 /var/run/docker.sock의 그룹(GID)과 다르면 권한 문제가 그대로 남습니다. 호스트 docker 그룹과 같은 GID로 생성해야 합니다.

# 호스트에서 실행
docker exec -u 0 jenkins bash -c "groupadd -g $(getent group docker | cut -d: -f3) docker && usermod -aG docker jenkins"

1.2 호스트 시스템 Docker 소켓 권한 설정

# Docker 소켓 권한 변경
sudo chmod 666 /var/run/docker.sock
2026-10 갱신 - 보안 주의

chmod 666은 호스트의 모든 사용자/컨테이너가 Docker 데몬(사실상 root 권한)에 접근할 수 있게 만듭니다. 테스트 용도로만 사용하고, 실제로는 아래 2.2처럼 root:docker + 660으로 두고 docker 그룹(GID 일치)으로 접근을 제어해야 합니다. 또한 데몬 재시작 시 소켓이 다시 생성되면서 권한이 원복됩니다.

2. Docker in Docker (DinD) 상세 설명

2.1 DinD 구성 방식

소켓 마운트 방식

DinD 방식

docker run -d \
  --name jenkins-dind \
  --privileged \
  -p 8080:8080 \
  -p 50000:50000 \
  docker:dind
2026-10 갱신

  • 기존에는 "보안 취약성(privileged 권한)"이 장점에 들어가 있었는데, 이는 단점이므로 바로잡았습니다.
  • docker:dind 이미지는 Docker 데몬만 들어 있고 Jenkins는 포함되어 있지 않습니다. 위 예시의 -p 8080:8080 -p 50000:50000은 Jenkins 포트라 이 컨테이너에서는 의미가 없습니다. 일반적으로는 DinD 컨테이너를 따로 띄우고, Jenkins 컨테이너가 DOCKER_HOST로 그 데몬에 접속하는 구성을 사용합니다.
docker run -d --name dind --privileged \
  -e DOCKER_TLS_CERTDIR=/certs \
  -v dind-certs:/certs \
  docker:dind
  • privileged를 피하고 싶다면 docker:dind-rootless, Sysbox 런타임, 또는 CI 이미지 빌드 전용으로 BuildKit(rootless)/Kaniko 같은 대안을 검토할 수 있습니다.

2.2 보안 강화를 위한 권한 제한

# Docker 그룹 권한 제한
sudo chown root:docker /usr/bin/docker
sudo chmod 750 /usr/bin/docker

# Docker 소켓 권한 제한
sudo chown root:docker /var/run/docker.sock
sudo chmod 660 /var/run/docker.sock

3. 문제 해결 및 디버깅

3.1 권한 문제 디버깅

# Jenkins 사용자 권한 확인
docker exec jenkins whoami
docker exec jenkins groups

# Docker 소켓 권한 확인
ls -l /var/run/docker.sock

# Docker 명령어 테스트
docker exec jenkins docker ps

3.2 로그 확인

# Jenkins 컨테이너 로그 확인
docker logs jenkins

# Docker 데몬 로그 확인
sudo journalctl -u docker

4. 보안 고려사항

최소 권한 원칙

네트워크 격리

# 전용 네트워크 생성
docker network create jenkins-network

# 네트워크 적용
docker run -d \
  --name jenkins \
  --network jenkins-network \
  -p 8080:8080 \
  -v jenkins_home:/var/jenkins_home \
  jenkins/jenkins:lts
2026-10 갱신

기존 예시는 마지막 줄이 \로 끝나 이미지 이름이 빠진 미완성 명령이었습니다. 문서 흐름(Jenkins 컨테이너를 전용 네트워크에 연결)에 맞춰 jenkins/jenkins:lts로 완성했습니다. 포트/볼륨은 상위 가이드와 동일한 값입니다.

볼륨 마운트 제한


관련 문서